#ifndef COLAPROTEGIDA_H_
#define COLAPROTEGIDA_H_

#include <queue>
#include "../Common/Mutex.h"
#include "Lock.h"

template <class T>
class ColaProtegida {
private:
	std::queue<T> cola;
	Mutex mutex;

public:
	
	//Agrega un elemento.
	void push(const T& e);
	
	//Retira un elemento.
	void pop();
	
	//Devuelve el primer elemento.
	T& front();
	
	//True si esta vacia, False si no.
	bool empty();
	
	//Vacia la cola.
	void vaciar();
	
	//Devuelve el tamanio.
	unsigned int size(){ Lock lock(mutex) ; return cola.size(); };
};


template <class T>
void ColaProtegida<T>::push(const T& e)
{
	Lock lock(mutex);
	cola.push(e);
}

template <class T>
void ColaProtegida<T>::pop()
{
	Lock lock(mutex);
	cola.pop();
}

template <class T>
T& ColaProtegida<T>::front()
{
	Lock lock(mutex);
	return cola.front();
}

template <class T>
bool ColaProtegida<T>::empty()
{
	Lock lock(mutex);
	return cola.empty();
}

template <class T>
void ColaProtegida<T>::vaciar()
{
	Lock lock(mutex);
	while(!cola.empty())
		cola.pop();
}

#endif /* COLAPROTEGIDA_H_ */
